package com.xml.dom;

import java.io.File;
import java.io.IOException;

import javax.xml.crypto.dsig.Transform;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;

public class DOMConvert2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
		try {
			DocumentBuilder db=dbf.newDocumentBuilder();
			Document doc=db.parse("gril.xml");
			
			Element elt=doc.createElement("gg");
			Element eltName=doc.createElement("name");
			Element eltAge=doc.createElement("age");
			
			Attr attr=doc.createAttribute("en");
			attr.setValue("003");
			
			//创建人物信息的文本节点
			Text txtName=doc.createTextNode("guoaiqin");
			Text txtAge=doc.createTextNode("25");
			
			//将文本节点添加为对应元素节点的子节点
			eltName.appendChild(txtName);
			eltAge.appendChild(txtAge);
			
			//将name和age节点添加为gg节点的子节点
			elt.appendChild(eltName);
			elt.appendChild(eltAge);
			
			//为<gg>添加sn属性节点
			elt.setAttributeNode(attr);
			
			//得到xml文档的根元素
			Element eltRoot =doc.getDocumentElement();
			
			//将gg节点添加为根元素的子节点。
			eltRoot.appendChild(elt);
			NodeList n1=doc.getElementsByTagName("gg");
			//------删除节点--------
			Node nodeDel=n1.item(0);
			nodeDel.getParentNode().removeChild(nodeDel);
			
			//---------修改节点-----
			//注意：NodeList对象是动态的，所以前面删除节点的操作会影响到NodeList
			//对象，NodeList中的节点对象会重新进行排列，此时，索引为0的节点是
			//先前节点列表中索引为1的节点
			Element eltChg=(Element) n1.item(0);
			Node nodeAgeChg=eltChg.getElementsByTagName("age").item(0);
			nodeAgeChg.getFirstChild().setNodeValue("33");
			
/*****增删改后保存信息*****************/
			//利用文档节点创建一个DOM输入源
			DOMSource source=new DOMSource(doc);
			//以gril.xml文件构造一个StreamResult对象，用于保存转换后结果
			//StreamResult result=new StreamResult(new File("gril.xml"));
			StreamResult result=new StreamResult(new File("gril.xml"));
			//得到转换器工厂类的实例
			TransformerFactory tff=TransformerFactory.newInstance();
			//创建一个新的转换器，用于执行恒等转换
			//即直接将DOM输入源的内容复制到结果文档中。
			Transformer tf=tff.newTransformer();
			//执行转换
			tf.transform(source, result);
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (TransformerConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (TransformerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}
